package com.zyz.controller;
import org.springframework.http.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.imageio.ImageIO;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;
@Controller  // 表示这是一个 Spring MVC 控制器类
@RequestMapping("/ct")
public class CTController {

    @RequestMapping("/cttestapi")  // 映射 HTTP 请求路径为 /cttestapi
    @ResponseBody  // 表示返回的是响应体内容，不是页面视图
    public String cttestapi() {
        try {
            // 1. 读取本地图片文件并转为字节数组（请将路径替换为你实际的图片路径）
            String imgPath = "F:/taitanworkplace/CTWork/0.28/26.jpg";
            // 1. 读取图片为 BufferedImage
            BufferedImage originalImage = ImageIO.read(new File(imgPath));

            // 2. 调整尺寸为 640x640
            BufferedImage resizedImage = new BufferedImage(640, 640, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = resizedImage.createGraphics();
            g.drawImage(originalImage, 0, 0, 640, 640, null);
            g.dispose();

            // 3. 将缩放后的图片写入 ByteArrayOutputStream
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(resizedImage, "jpg", baos);
            byte[] imageBytes = baos.toByteArray();

            // 4. 转为 Base64 编码
            String imageBase64 = Base64.getEncoder().encodeToString(imageBytes);

            // 3. 设置密钥内容（注意此处是人为设置的密钥内容，需要与后端校验逻辑一致）
            String secretKey = "泰坦科技逸达生物研发";

            // 4. 对 secretKey 进行第一次 Base64 编码（字符串 -> 字节 -> base64字符串）
            String encodedOnce = Base64.getEncoder().encodeToString(secretKey.getBytes("UTF-8"));
            // 5. 对上一次编码结果再进行第二次 Base64 编码
            String encodedTwice = Base64.getEncoder().encodeToString(encodedOnce.getBytes("UTF-8"));

            // 6. 构造请求体的 JSON 数据（key 为 image_base64 和 secret_key）
            Map<String, Object> body = new HashMap<>();// 创建一个Map对象，用于存储请求体数据
            body.put("image_base64", imageBase64);  // 放入图像的 base64 编码
            body.put("secret_key", encodedTwice);   // 放入加密后的密钥

            // 7. 创建请求头，指定为 JSON 类型
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);

            // 8. 封装请求体和请求头为一个 HttpEntity 对象
            HttpEntity<Map<String, Object>> entity = new HttpEntity<>(body, headers);

            // 9. 创建 RestTemplate 实例，用于发起 HTTP 请求
            RestTemplate restTemplate = new RestTemplate();

            // 10. 设置 Python FastAPI 接口的 URL（本地地址）
            String apiUrl = "http://101.132.89.225:8090/ctdetectapi";

            // 11. 发起 POST 请求，请求体为 entity，响应类型为字符串
            ResponseEntity<String> response = restTemplate.postForEntity(apiUrl, entity, String.class);

            //12.解析成json的形式
            try{
                // 获取 JSON 字符串响应
                String jsonBody = response.getBody();

                // 使用 Jackson 的 ObjectMapper 将字符串转成 Map
                ObjectMapper mapper = new ObjectMapper();
                Map<String, Object> jsonMap = mapper.readValue(jsonBody, Map.class);

                // 提取字段
                int status = (Integer) jsonMap.get("status");
                String message = (String) jsonMap.get("message");

                // 判断状态
                if (status == 200) {
                    Map<String, Object> data = (Map<String, Object>) jsonMap.get("data");
                    // 循环一下
                    for (String key : data.keySet()) {
                        Map<String, Object> labResult = (Map<String, Object>) data.get(key);
                        Double deltaE_C = ((Number) labResult.get("deltaE_C")).doubleValue();
                        Double deltaE_T = ((Number) labResult.get("deltaE_T")).doubleValue();
                        Double tcLabValue = ((Number) labResult.get("TCLabValue")).doubleValue();
                        Double tcWightValue = ((Number) labResult.get("TCWightValue")).doubleValue();
                        System.out.println(String.format("key: %s, ΔE_C: %f, ΔE_T: %f, TCLabValue: %f, TCWightValue: %f",
                                key, deltaE_C, deltaE_T, tcLabValue, tcWightValue));
                    }
                    return "成功: " + message + "\n数据: " + data.toString();
                } else {
                    return "失败: " + message + "\n状态码: " + status;
                }
            }catch (Exception e) {
                return "JSON 解析失败: " + e.getMessage();
            }

            // 12. 返回接口调用成功的信息及后端响应内容
            //return "接口调用成功:\n" + response.getBody();

            // 13.输出

        } catch (Exception e) {
            // 如果发生异常，打印堆栈信息并返回错误提示
            e.printStackTrace();
            return "调用失败，错误信息: " + e.getMessage();
        }
    }
}

